package yns.springboot.guide.demo.scheduled;

import java.time.LocalDateTime;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

//@EnableScheduling
@Component
public class ScheduledTasks {
	
	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	// 按指定周期执行，以毫秒为单位 （between invocations）
    @Scheduled(fixedRate = 2000)
    public void doFixedRate() {
        logger.info("doFixedRate start : " + LocalDateTime.now());
        try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        logger.info("doFixedRate  end : " + LocalDateTime.now());
    }
    
    // 下次执行在前一次执行完成后按指定周期执行，以毫秒为单位 （between the end of the last invocation and the start of the next）
    @Scheduled(fixedDelay = 2000)
    public void doFixedDelay() {
        logger.info("doFixedDelay start : " + LocalDateTime.now());
        try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        logger.info("doFixedDelay end : " + LocalDateTime.now());
    }
    
    // 第一次initialDelay执行之后，按fixedRate或fixedDelay方式执行
	@Scheduled(initialDelay = 1000, fixedRate = 6000)
    public void doInitialDelay() {
        logger.info("doInitialDelay  start : " + LocalDateTime.now());
        try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        logger.info("doInitialDelay  end : " + LocalDateTime.now());
    }
     
//	  [New in Spring 5.3: Improved Cron Expressions](https://spring.io/blog/2020/11/10/new-in-spring-5-3-improved-cron-expressions)  
//    "0 0 * * * *" = the top of every hour of every day.
//    "*/10 * * * * *" = every ten seconds.
//    "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
//    "0 0 6,19 * * *" = 6:00 AM and 7:00 PM every day.
//    "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 every day.
//    "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
//    "0 0 0 25 12 ?" = every Christmas Day at midnight
    
//  1.秒(0-59)
//  2.分钟(0-59)
//  3.小时(0-23)
//  4.天(月) (0-31，但是你需要考虑你月的天数)
//  5.月(0-11)
//  6.天(星期) (1-7 1=SUN 或  SUN，MON，TUE，WED，THU，FRI，SAT)
//  7.年份(1970-2099)

//    序号	说明	是否必填	允许填写的值	                                   允许的通配符
//     1	   秒	     是	      0-59	                , - * /
//     2	   分	     是	      0-59	                , - * /
//     3	   小时	     是	      0-23              	, - * /
//     4	   日	     是	      1-31	                , - * /  L W
//     5	   月	     是	      1-12 or JAN-DEC	    , - * /
//     6	   周	     是	      1-7 or SUN-SAT 	    , - * / L #
//     7	   年	     否	      empty or 1970-2099	, - * /
    
//  * 表示所有值，在分钟里表示每一分钟触发。在小时，日期，月份等里面表示每一小时，每一日，每一月。
//
// 　？表示不指定值。表示不关心当前位置设置的值。 比如不关心是周几，则周的位置填写？。主要是由于日期跟周是有重复的所以两者必须有一者设置为？
//
// 　- 表示区间。小时设置为10-12表示10,11,12点均会触发。
//
// 　，表示多个值。 小时设置成10,12表示10点和12点会触发。
//
// 　/ 表示递增触发。 5/15表示从第5秒开始，每隔15秒触发。
//
// 　L 表示最后的意思。 日上表示最后一天。星期上表示星期六或7。 L前加数据，表示该数据的最后一个。星期上设置6L表示最后一个星期五。  6表示星期五
//
// 　W 表示离指定日期最近的工作日触发。15W离该月15号最近的工作日触发。
//
// 　# 表示每月的第几个周几。 6#3表示该月的第三个周五。
    
    @Scheduled(cron = "1 * * * * *")  
    public void doCron() {  
        logger.info("doCron  start : " + LocalDateTime.now());
        try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        logger.info("doCron  end : " + LocalDateTime.now());
    }  

}
